package com.joy.joyusers.script;

import com.alibaba.excel.EasyExcel;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ImportExecl {

    public static void main(String[] args) {
        String fileName = "D:\\知识星球项目\\partner-match-backend\\src\\main\\resources\\testUser.xlsx";
        ReadImportUserfun2(fileName);
    }

    /**
     * 监听器读取execl文件
     * 监听器读取：单独抽离的处理逻辑，代码清晰易于维护
     * 一行一行处理数据，适用于数据量大的场景
     * * @param fileName
     */
    public static void ReadImportUserfun1(String fileName) {
        // 写法1：JDK8
        // since: 3.0.0-beta1
        // 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行
        // 具体需要返回多少行可以在`PageReadListener`的构造函数设置
        EasyExcel.read(fileName, ImportUser.class, new TableListener()).sheet().doRead();
    }

    /**
     * 同步返回数据，数据量大的情况下数据会放到内存里面
     * 无需创建监听器，一次性返回全部数据
     * @param fileName
     */
    public static void ReadImportUserfun2(String fileName) {
        // 这里 需要指定读用哪个class去读，然后读取第一个sheet 同步读取会自动finish
        List<ImportUser> userlist = EasyExcel.read(fileName).head(ImportUser.class).sheet().doReadSync();
        System.out.println("读取到的数据量:" + userlist.size());
        /**
         * 首先对获取到的用户数据昵称进行分组，这一步是为了去重，表格数据我已经处理过了，但是这一步还是不可少
         * 用流处理，收集，然后通过名称分组，这样就能区分有没有重复名称
         * 要进行判空处理,这个map<用户名称, 分组的昵称数量>
         * 如果昵称数量大于1的，是不是就是有重复的了
         */
        Map<String, List<ImportUser>> userFilterlist =
                userlist.stream().filter(user -> StringUtils.isNotEmpty(user.getName()))
                        .collect(Collectors.groupingBy(ImportUser::getName));
        for (Map.Entry<String, List<ImportUser>> stringListEntry : userFilterlist.entrySet()) {
            // 判断重复
            if (stringListEntry.getValue().size() > 1) {
                System.out.println("重复的昵称是:" + stringListEntry.getKey());
            }
        }
        // 输出不重名的key数量
        System.out.println("不重名的key数量:" + userFilterlist.keySet().size());
    }

}
